#include "qdatabaseloader.h"

#include "qxmlfile.h"

#include <QFile>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QVariant>

QDataBaseLoader::QDataBaseLoader(int keyword_index):
    m_keyword_index(keyword_index)
{

}

QDataBaseLoader::~QDataBaseLoader()
{
    qDeleteAll(m_pages);
    m_pages.clear();
}

bool QDataBaseLoader::load(const QString &path)
{
    qDeleteAll(m_pages);
    m_pages.clear();


    if(!QFile::exists(path))
    {
        return false;
    }

    QFile f(path);
    if(!f.open(QFile::ReadOnly))
    {
        return false;
    }

    QString str=QString::fromUtf8(f.readAll().data());

    QXMLFile xml;
    if(!xml.load(str,0))
    {
        return false;
    }

    QList<QXMLFile*>    list=xml.get_children_by_title("Worksheet");
    foreach(QXMLFile* page,list)
    {
        QXMLFile* table=page->get_children().first();
        QList<QXMLFile*> rows=table->get_children_by_title("Row");
        if(rows.size()<1)
        {
            continue;
        }
        rows.removeFirst();
        tagPage* p=new tagPage;
        p->m_name=page->get_property("Name");
        int col=0;
        int index;
        foreach(QXMLFile* row,rows)
        {
            QStringList l;
            foreach(QXMLFile* cell,row->get_children_by_title("Cell"))
            {
                index=cell->get_property("Index").toInt()-1;
                while(index>l.size())
                {
                    l.append("");
                }
                if(cell->get_children().size()==0)
                {
                    l.append("");
                    continue;
                }
                if(cell->get_children().first()->get_children().size()!=0)
                {
                    l.append(cell->get_children().first()->get_children().first()->get_text());
                }
                else
                {
                    l.append(cell->get_children().first()->get_text());
                }
            }
            if(col<l.size())
            {
                col=l.size();
            }
            p->m_datas.append(l);
            if(m_keyword_index>=0 && m_keyword_index<l.size())
            {
                p->m_keyword_to_data.insert(l.at(m_keyword_index),l);
            }
        }

        for(int i=0;i<p->m_datas.size();i++)
        {
            QStringList list=p->m_datas.at(i);
            while(list.size()<col)
            {
                list.append("");
            }
            p->m_datas.replace(i,list);
        }

        m_pages.append(p);
        m_name_to_page.insert(p->m_name,p);
    }


    if(m_pages.size()==0)
    {
        return false;
    }
    return true;
}

tagPage* QDataBaseLoader::get_page(const QString &name)
{
    return m_name_to_page.value(name);
}

tagPage* QDataBaseLoader::get_page(int index)
{
    if(index>=0 && index<m_pages.size())
    {
        return m_pages.at(index);
    }
    else
    {
        return NULL;
    }
}

int QDataBaseLoader::get_page_count()
{
    return m_pages.size();
}

QList<tagPage*> QDataBaseLoader::get_pages()
{
    return m_pages;
}
